package com.luoc;

import com.luoc.mybatis.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射相关方法
 */
public class ReflectionDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //通过反射来创建对象
        User user = User.class.getDeclaredConstructor().newInstance();
        user.setAge(19);
        user.setName("小帅哥");
        //获取类的信息
        Class<?> aClass = Class.forName("org.example.User");
        System.out.println("class:"+aClass);
        Class<? extends User> userClass = user.getClass();
        //获取全路径类名
        String name = userClass.getName();
        //获取类名
        String simpleName = userClass.getSimpleName();
        System.out.println("name:"+name+"\nsimplename:"+simpleName);
        //获取父类
        Class  superclass = userClass.getSuperclass();
        //获取类的接口
        Class<?>[] interfaces = userClass.getInterfaces();
        //获取构造方法
        Constructor<?>[] constructors = userClass.getConstructors();
        //获取类的方法
        //包含父类自身所有方法
        Method[] methods = userClass.getMethods();
        //自身所有方法
        Method[] declaredMethods = userClass.getDeclaredMethods();
        //获取类中字段
        //获取公开publid字段
        Field[] fields = userClass.getFields();
        //获取所有字段
        Field[] declaredFields = userClass.getDeclaredFields();
        //获取指定字段
        Field adress = userClass.getDeclaredField("adress");
        //获取字段权限
        adress.setAccessible(true);
        //设置字段值
        adress.set(user, "王者峡谷");
        System.out.println("user:"+user);
        //反射应用场景：框架的开发、工具类
        //注意事项：安全问题、性能问题

    }
}
